﻿using System;

namespace NNTH
{
    public static class ReadNumber
    {
        public static string tachTen(string HoTen)
        {
            string sv1 = HoTen;
            
            sv1 = Console.ReadLine();
            
            int n= sv1.Length;
            //ta Ho cua sinh vien duoc ket thuc bang khoang trang
            //vi vay dem do dai cua Ho tu` dau` den khoang trang gan nhat
            int x = sv1.IndexOf(" ");
            //ta thay Ten cua sinh vien la ky tu cuoi cung, phan 
            //biet voi cac ky tu khac bang khoang trang cuoi cung
            //nen dung ham lastindexof de dem so ky tu tu dau den het khoang trang cuoi cung
            // roi lay do dai cua chuoi tru cho gia tri lastindexof se ra do dai cua ten
            int y = sv1.LastIndexOf(" ");
            //tach ten o vi tri y (khoang trang cuoi cung ) voi do dai la n-y (do dai cua ten)
            string ten = sv1.Substring(y, n - y);
            //tach ho o vi tri dau tien voi do dai la x (do dai cua ho)
            string ho = sv1.Substring(0, x);
            //tach tung tu trong ho ten sinh vien va dua vao mang
            char dau = char.Parse(" ");
            string[] mang1 = new string[100];
            mang1 = sv1.Split(dau);
            //dem so ky tu cua mang 
            int dodai = mang1.Length;
            //xuat ten, ho, dem so tu
            Console.WriteLine("Ten: {0}",ten);
            Console.WriteLine("Ho: {0}", ho);
            Console.WriteLine("Tong so tu la: {0}",dodai);
            //xuat nguoc
            for (int i = dodai -1; i >= 0; i--)
                Console.WriteLine(mang1[i]);
            return ten;

        }


        static String _DonVi(string dv)
        {
            String kq = "";
            switch (dv)
            {
                case "0": kq = ""; break;
                case "1": kq = "một"; break;
                case "2": kq = "hai"; break;
                case "3": kq = "ba"; break;
                case "4": kq = "bốn"; break;
                case "5": kq = "năm"; break;
                case "6": kq = "sáu"; break;
                case "7": kq = "bảy"; break;
                case "8": kq = "tám"; break;
                case "9": kq = "chín"; break;
            }
            return kq;
        }
        static String _Chuc(String chuc)
        {
            String kq = "";
            int Ch1 = Convert.ToInt32(chuc[1].ToString());
            int Ch = Convert.ToInt32(chuc);
            if (Ch < 20)
            {
                if (Ch == 10) kq = "mười";
                else if (Ch == 11) kq = "mười một";
                else if (Ch == 15) kq = "mười lăm";
                else kq = "mười " + _DonVi(chuc[1].ToString());
            }
            else if (Ch1 == 1) kq = _DonVi(chuc[0].ToString()) + " mươi mốt";
            else if (Ch1 == 5) kq = _DonVi(chuc[0].ToString()) + " mươi lăm";
            else if (Ch1 == 0) kq = _DonVi(chuc[0].ToString()) + " mươi ";
            else
                kq = String.Format("{0} mươi {1}", _DonVi(chuc[0].ToString()), _DonVi(chuc[1].ToString()));
            if (chuc[0].ToString() == "0")
            {
                kq = kq.Replace(" mươi ", "");
                kq = kq.Replace("mười ", "");
            }
            return kq;
        }
        static String _Tram(String tram)
        {
            String kq = "";
            int tr = Convert.ToInt32(tram);
            if (tr == 0) kq = "";
            else if (tram.Length == 1)
                kq = _DonVi(tram);
            else if (tram.Length == 2)
                kq = _Chuc(tram);
            else if (tr % 100 == 0)
                kq = _DonVi(tram[0].ToString()) + " trăm";
            else if (tr < 100)
                kq = "lẻ " + _Chuc(tram.Substring(1).ToString());
            else
                if (tram[1].ToString() != "0")
                    kq = String.Format("{0} trăm {1}", _DonVi(tram[0].ToString()), _Chuc(tram.Substring(1).ToString()));
                else
                    kq = String.Format("{0} trăm lẻ {1}", _DonVi(tram[0].ToString()), _DonVi(tram[2].ToString()));
            return kq;
        }
        static String[] TaoMangSo(String nghin)
        {
            try { nghin = (Convert.ToInt32(nghin)).ToString(); }
            catch (Exception) { }
            int d, k, n, vt; d = k = n = vt = 0;
            int i = nghin.Length;
            if (i % 3 == 0)
                n = i + (i / 3) - 1;
            else
                n = i + (i / 3);
            string[] arr = new String[n];
            n--;
            while (i > 0)
            {
                if (d != 3)
                {
                    d++;
                    if (nghin[i - 1].ToString() != " " && nghin[i - 1].ToString() != "\n")
                        arr[n - vt] = nghin[i - 1].ToString();
                }
                else
                {
                    d = 1; k++;
                    if (k == 3)
                    {
                        k = 0;
                        Cap_ti++;
                        arr[n - vt] = "_";
                    }
                    else arr[n - vt] = ",";
                    vt++;
                    arr[n - vt] = nghin[i - 1].ToString();
                }
                vt++;
                i--;
            }
            t = string.Join("", arr);
            return (string.Join("", arr)).Split('_');

        }
        static String DocSo(String[] arr)
        {
            String[] ArrCapSo;
            String kq, k1, k2, k3, Ti, Tr, Ng;
            kq = k1 = k2 = k3 = Ti = Tr = Ng = "";
            int i = arr.Length;
            while (i > 0)
            {
                if (Cap_ti > 0 && i < arr.Length) Ti = Ti + " tỉ ";
                ArrCapSo = arr[i - 1].Split(',');
                string Tra = _Tram(ArrCapSo[0].ToString());
                switch (ArrCapSo.Length)
                {
                    case 1: k1 = Tra + Ti; break;
                    case 2: k2 = String.Format("{0} nghìn {1}{2}", Tra, _Tram(ArrCapSo[1].ToString()), Ti); break;
                    case 3:
                        int Tram = Convert.ToInt32(ArrCapSo[0]);
                        Tr = Tra;
                        if (Tram > 0)
                            if (Tram < 100)
                                Tr = Tr.Replace(" lẻ ", "") + " triệu ";
                            else Tr += " triệu ";
                        else
                            Tr = Tra;
                        Ng = _Tram(ArrCapSo[1]);
                        if (Convert.ToInt32(ArrCapSo[1]) > 0)
                            Ng += " nghìn ";
                        k3 = Tr + Ng + _Tram(ArrCapSo[2]) + Ti;
                        break;
                }
                i--;
                kq = k1 + k2 + k3 + kq;
                Tr = Ng = k1 = k2 = k3 = "";
            }
            Cap_ti = 0;
            return kq;

        }
        public static string ByWords(this long so)
        {
            string chuoi = so.ToString();
            string kq = "";
            try
            {
             
                if (chuoi != "")
                {
                    if (so == 0)
                        kq = "không";
                    else kq = DocSo(TaoMangSo(chuoi));
                }
            }
            catch (Exception)
            {
                try
                {
                    kq = DocSo(TaoMangSo(chuoi));
                }
                catch (Exception)
                { kq = "Số tiền quá lớn, bạn không có khả năng để thanh toán"; }
            }

            return Viethoa(kq);
        }
        static private string Viethoa(string str)
        {
            char[] chrs = str.ToCharArray();
            chrs[0] = char.ToUpper(chrs[0]);
            return  new string(chrs);

        }
        static int Cap_ti { get; set; }

        static string t { get; set; }
    }
}
